객체 지향 프로그래밍이란 실세계에서의 개념을 추상화하여 프로그래밍 상의 객체로 옮겨 놓는 방식으로 코드를 작성하는 방법을 말한다. 예를 들면 자동차라는 객체를 프로그래밍 하려면 자동차의 특성과 기능을 추려 이를 프로그래밍 할 수 있다. 자동차는 바퀴,헤드라이트, 핸들, … 등을 가지고 전진, 후진, 방향 전환 등의 기능을 가지고 있다. 이러한 특성과 기능을 모아 자동차라는 객체 클래스를 만들면 추가적인 특성을 가진 자동차 객체를 코딩하거나 자동차 객체를 여러개 생성하게 될 때 등등 코드를 재사용률이 커진다.
객체 지향 프로그래밍에는 4가지 특성과 5가지의 설계원칙이 있다.
객체지향 4가지 특성
추상화 - 추상화란 현실 세계의 객체의 공통된 특징과 기능을 추출하는 것을 의미한다. 동물은 사자, 원숭이, 코끼리 등등 많은 것이 존재하지만 이 동물들의 기본적인 특성과 기능을 모아 동물이라는 클래스를 정의하는 것을 추상화라고 한다. 동물은 모두 호흡을하고 심장을가지고 있으며 움직인다라는 특성과 기능을 가지고 있는데 이러한 것들을 한군데 모아 정의하는 것을 의미한다.
다형성 - 다형성에는 오버로딩과 오버라이딩이 있다. 똑같은 이름의 함수여도 함수의 인자의 갯수나 타입, 상속 받은 객체에서의 오버라이딩에 대해서 다르게 동작하는 것을 의미한다.
오버로딩은 파라미터의 개수나 타입이 다른 함수를 정의하는 것을 의미한다. 예를 들어 두 정수를 더하는 public void sum(int a,int b)라는 함수를 정의했다고 하면 두 실수를 더하기 위한 함수인 public void sum(double a,double b)함수를 정의할 수 있다. 이 함수는 똑같은 이름으로 호출하지만 집어넣는 인자의 타입에 따라 다른방식으로 동작할 수 있다.
오버라이딩은 상속에 의해 부모가 가진 함수를 재정의 하여 사용하는 것을 의미한다. 부모 객체가 ‘안녕 나는 부모’라는 메시지를 출력하는 say()라는 함수를 가지고 있다고 하면 자식 객체는 부모 객체를 상속받으면서 이 함수에 대해 오버라이딩을 하여 ‘안녕 나는 자식’이라는 메시지를 출력하도록 변경할 수 있다.
상속성 - 상속성은 부모 객체의 특성을 자식이 물려받는 것을 의미한다. 상속을 통해 부모가 가진 기능에 대하여 물려받아 사용할 수 있다. 예를 들어 자동차라는 클래스를 상속받은 슈퍼카 클래스는 기본 기능인 전진, 후진, 방향 전환 등의 기능을 모두 물려받고 자신의 특성인 부스트, 드리프트 기능등 자신의 특징만 추가하면된다.
캡슐화 - 캡슐화란 클래스가 동작하는 것에 대해 사용자가 그 내부 동작을 모르게 동작한다는 것을 의미한다. 예를 들어 환자는 감기약이라는 캡슐 알약 하나를 먹지만 캡슐 알약에는 항생제, 수면제, 등등 많은 작용을 하는 성분들이 들어가 있고 작용을 하지만 환자는 이를 알 수 없다. 이처럼 클래스는 자신이 동작하는 것에 대해 사용자가 알 필요가 없이 동작하는 것을 캡슐화라고 한다.
객체지향 5가지 설계 원칙
- SRP(Single Responsibility Principle) 단일 책임 원칙
- 클래스는 단 하나의 기능을 가지고 클래스가 제공하는 모든 서비스는 그 하나의 기능을 수행하는 데 집중해 있어야 한다.
- OCP(Open - Closed Principle) 개방 폐쇄의 원칙
- 확장에는 열려있고 변경에는 닫혀있어야 한다.
- LSP(Liskov Substitution Principle) 리스코프 치환 원칙
- 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
- ISP(Interface Segregation Principle) 인터페이스 분리 원칙
- 인터페이스는 그 인터페이스를 사용하는 사용자 기준으로 분리해야 한다.
- DIP(Dependency Inversion Principle) 의존 역전의 법칙
- 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다.